/*
 * Author:
 * 		Davi Costa Clemente 		RA 083413
 * 		Fernando Lener de Arruda	RA 081391
 */

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>
#include <sys/time.h>
#include "common.h"

int listeningSocket = 0;

void closeListener(int sig) {
	close(listeningSocket);

	if(sig==SIGPIPE){
		printf("Falha ao escrever/ler do socket\n");
	}
	printf("Finalizando servidor\n");
	exit(1);
}



void treatClient(int fd){
	struct sockaddr_in receiveAddress;
	ClientType client;
	RequestType request;
	int stockUpdate;
	char * msg, *isbn;

	printf("Esperando por requisição\n");

	receiveBookRequest(&client,&request,&isbn,&stockUpdate,fd,&receiveAddress);

	printf("Requisição recebida\n");

	msg = createBookRequestReply(client,request,isbn,stockUpdate);

	safeSend(msg,fd,&receiveAddress);

	printf("Resposta enviada\n");


}

int main(int argc, char **argv) {

	if(argc<2 || atoi(argv[1])<10000){
		printf("Espera-se que a porta seja passada por parâmetro e seja maior que 10000\n");
		exit(1);
	}

	signal(SIGINT,closeListener);
	signal(SIGPIPE,closeListener);

	//ListeningSocket porque estamos 'escutando' mensagens
	listeningSocket = createUDPSocket(atoi(argv[1]));

	while (1) {
		treatClient(listeningSocket);
	}


	return 0;
}
